1) Análise da concentração de partículas inaláveis finas (MP\(_{2.5}\)) da cidade de London, província de Ontário, Canadá, no ano de 2013


Contextualização do problema:

O arquivo Matter2013-London.csv, obtido em http://www.airqualityontario.com, contém informações sobre as concentrações de partículas inaláveis finas (MP\(_{2,5}\), em \(\mu g/m^{3}\) ), registradas no ano de 2013 em London, cidade situada na província canadense de Ontário. Os valores são registrados a cada hora. Para determinado dia D, as variáveis \(\textit{H}_{1}\) a \(\textit{H}_{24}\) representam as medições feitas na primeira até a \(24^{ª}\) hora do dia, respectivamente.

O objetivo é realizar uma análise exploratória desta série temporal dada por:

\[Y_{t} = min\{H_{j,t}\}\]


item i)

Dados brutos antes do tratamento:

# ----- leitura e carregamento
library(tibbletime)
library(dplyr)
library(ggplot2)
library(readr)
library(lubridate)
library(reshape2)

matter.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/Matter2013-London.csv"

matter <- read_csv(matter.loc)
head(matter)

Dados após preparação:

# ----- data preparation

# passando para formato long;
# eliminando as duas primeiras colunas;
# eliminando os NA's e as entradas com 9999 e -999;
# agrupando por dia e calculando o minimo
matter2 <- matter %>%
  dplyr::select(-(1:2)) %>% # eliminando duas primeiras colunas
  melt(id.vars = "Date") %>% # to long
  magrittr::set_colnames(c("Date", "hora", "MP")) %>%
  dplyr::arrange(Date, hora) %>% # ordenar por dia/hora 
  mutate(MP = replace(MP, MP == 9999 | MP == -999, NA)) %>% # sol: https://stackoverflow.com/questions/35610437/using-dplyr-to-conditionally-replace-values-in-a-column
  na.omit() %>%
  dplyr::mutate(hora = stringr::str_extract(hora, "\\d+")) %>%
  # dplyr::mutate(hora = paste0(hora, ":00:00")) %>%
  dplyr::mutate(Date = lubridate::ymd_h(paste(Date, hora))) %>%
  group_by(Date) %>%
  summarise(MP = as.numeric(min(MP, na.rm=TRUE))) # a serie eh baseada no minimo do dia
  # nao precisamos das horas


# passando para tibble e tibbletime:
matter3 <- matter2 %>%
  #tibble::as_tibble() %>%
  #na.omit() %>% # eliminando os NA's
  # mutate(Date = lubridate::ymd_hms(Date)) %>% # usando ymd do lubridate
  as_tbl_time(index = Date)



head(matter3)

Gráfico da série temporal \(Y_{t}\):

# ----- plots serie:

# --- serie:
# ggplot:
# matter3 %>%
# ggplot() +
#   geom_line(aes(x = Date, y = MP), colour="orange") +
#   theme_minimal()+
#   labs(title="Série diária de MP")

# dygraphs
library(dygraphs)
library(xts)
matter3_ts <- xts(matter3 %>% dplyr::select(MP), order.by=matter3$Date)
# dygraph(matter3_ts, elementId='matter3') %>% dyRangeSelector()# %>% dyUnzoom()
dygraph(matter3_ts, elementId='matter3', main="Série diária da variável MP" ) %>% dyRangeSelector() %>% dyUnzoom() %>%
  dySeries("MP", color = "orange", strokeWidth = 0.7)
# rCharts:
# library(rCharts)
# library(rjson)
# dPlot(MP ~ Date, data = matter3, type="line")

Plots da ACF e PACF:

# --- preparando o plot:

# funcoes para plotar ACF e PACF nos moldes do ggplot2
# adaptado de: https://stackoverflow.com/questions/42753017/adding-confidence-intervals-to-plotted-acf-in-ggplot2
gg_acf <- function(ts, title, lag.max){
  ts_acf <- acf(ts, lag.max = lag.max, na.action = na.pass, plot=FALSE)
  
  # conf <- 0.95
  # conf_lims <- c(-1,1)*qnorm((1 + conf)/2)/sqrt(ts_acf$n.used)
  # info do pofessor para bandas de confiança
  conf_lims <- c(-1,1)*2/sqrt(ts_acf$n.used)
  
  ts_acf$acf %>% 
  # tibble::as_tibble() %>% dplyr::mutate(lags = 0:(n()-1)) %>%  # acf começa em zero e termina em n-1
  tibble::as_tibble() %>% dplyr::mutate(lags = 0:(lag.max)) %>%  # acf começa em zero e termina em lag.max
  ggplot2::ggplot(aes(x=lags, y = V1)) + ggplot2::scale_x_continuous(breaks=seq(0,lag.max,lag.max/10)) +
  ggplot2::geom_hline(yintercept=conf_lims, lty=2, col='red', size=0.3) +
  ggplot2::labs(y="Autocorrelations", x="Lag", title=title) +
  ggplot2::geom_segment(aes(xend=lags, yend=0)) + theme_minimal()
  #+ ggplot2::geom_point()
}

gg_pacf <- function(ts, title, lag.max){
  ts_pacf <- pacf(ts, lag.max = lag.max, na.action = na.pass, plot=FALSE)
  
  # corrigindo no zero:
  ts_pacf$acf <- c("0"=1, ts_pacf$acf)
  
  # conf <- 0.95
  # conf_lims <- c(-1,1)*qnorm((1 + conf)/2)/sqrt(ts_pacf$n.used)
  # info do pofessor para bandas de confiança
  conf_lims <- c(-1,1)*2/sqrt(ts_pacf$n.used)
  
  ts_pacf$acf %>% # tb eh acf o objeto dentro do output de pacf
  # tibble::as_tibble() %>% dplyr::mutate(lags = 1:n()) %>%  # pacf começa em 1 e termina em n
  tibble::as_tibble() %>% magrittr::set_colnames(c("V1")) %>% # para funcionar apos a inclusao do zero
  dplyr::mutate(lags = 0:(lag.max)) %>%  # acf começa em zero e termina em lag.max
  ggplot2::ggplot(aes(x=lags, y = V1)) + ggplot2::scale_x_continuous(breaks=seq(0,lag.max,lag.max/10)) +
  ggplot2::geom_hline(yintercept=conf_lims, lty=2, col='red', size=0.3) +
  ggplot2::labs(y="Partial Autocorrelations", x="Lag", title=title) +
  ggplot2::geom_segment(aes(xend=lags, yend=0)) + theme_minimal()
  #+ ggplot2::geom_point()
}
# ----- plots:

# par(mfrow=c(1,2))
# acf(matter3_ts)
# pacf(matter3_ts)

library(gridExtra)
# grid.arrange(gg_acf(matter3_ts), gg_pacf(matter3_ts), ncol=2)
grid.arrange(gg_acf(matter3_ts, "FAC", lag.max=100), gg_pacf(matter3_ts, "FACP", lag.max=100))


item ii)

O Gráfico da série não indica ausência de estacionariedade, pelo menos no que se refere a sua média. No entanto, com base no gráfico da função de Autocorrelação (ACF) o fato de \(\rho(1) \sim 1\), implica um comportamento quase de passeio aleatório \((X_t \sim X_{t-1})\). Isto, juntamente com um comportamento aparentemente sazonal, implica em uma forte evidência de não-estacionariedade. Por este motivo, diferenciaremos a série para \(H=1\), com o objetivo de obter uma série estacionária.

Derivação da série para obtenção da estacionariedade:

Há algumas técnicas que podemos utilizar para transformar uma série não-estacionária em estacionária. Shumway & Stoffer (2011, pp. 45-47) enumeram: detrending por meio da remoção de uma posível tendência na série temporal; differenciating que consiste em fazer subtrações sucessivas da série sobre ela mesma em um ou mais períodos anteriores; e transformações como \(log(x_{t})\) e Box-Cox. Os próprios autores indicam que, se objetivo é obter a estacionariedade, a opção mais adequada é diferenciar a série. O mesmo propõe Moretin (2005, pp. 4-5), acrescentando ainda, que na maioria das vezes são necessárias apenas uma ou duas diferenças para tornar a série estacionária. Portanto, com base nestes argumentos, empregaremos a diferenciação de primeira ordem.

Dados após diferenciação de ordem 1:

matter3_ts_diff <- diff(matter3_ts)
# matter3_ts_diff <- diff(matter3_ts_diff)
# str(ph2_ts_diff)

tibble::as.tibble(head((matter3_ts_diff)))

Plot da série após diferenciação:

dygraph(matter3_ts_diff, elementId='matter3_diff', main="Série diferenciada da variável MP" ) %>% dyRangeSelector() %>% dyUnzoom() %>%
  dySeries("MP", color = "orange", strokeWidth = 0.3)

Pelo padrão do gráfico, é possível dizer que a série não apresenta índicios claros de comportamento não estacionário, pelo menos no que se refere a média do processo. No entanto, faremos os plots da FAC e FACP a fim de confirmar este resultado.

Plots da ACF e PACF:

grid.arrange(gg_acf(matter3_ts_diff, "FAC", lag.max=100), gg_pacf(matter3_ts_diff, "FACP", lag.max=100))

Com a queda abrupta da Função de Autocorrelação no lag \(1\), temos um forte indicativo de estacionariedade na série. Como não parece haver um decaimento rápido, sugere-se tratar-se de um processo de decaimento relativamente lento, o que implicaria em um modelo autorregressivo ou de médias móveis de ordem relativamente alta.

Como seriam modelos de complexos, optamos por efetuar a segunda derivada da série e tentar obter um modelo mais simples.

Dados após diferenciação de ordem 2:

# matter3_ts_diff <- diff(matter3_ts)
matter3_ts_diff <- diff(matter3_ts_diff)
# str(ph2_ts_diff)

tibble::as.tibble(head((matter3_ts_diff)))

Plot da série após diferenciação:

dygraph(matter3_ts_diff, elementId='matter3_diff2', main="Série diferenciada da variável MP" ) %>% dyRangeSelector() %>% dyUnzoom() %>%
  dySeries("MP", color = "orange", strokeWidth = 0.3)

Plots da ACF e PACF:

grid.arrange(gg_acf(matter3_ts_diff, "FAC", lag.max=100), gg_pacf(matter3_ts_diff, "FACP", lag.max=100))


item iii)

Com a diferenciação de primeira ordem, e com base nos gráficos da PAC e PACF, poderíamos utilizar um processo de médias móveis puro integrado ARIMA(0,1,15), ou um modelo autorregressivo puro integrado ARIMA(12,1,0).

Com a diferenciação de segunda ordem, mantivemos a estacionariedade e, com base na Função de Autocorrelação, teríamos um modelo de médias móveis puro integrado * ARIMA(0,2,3) *.



2) Análise de dados de Potencial Hidrogeniônico (pH) coletados pelo Departamento de Recursos Hídricos do estado da Califórnia - EUA


Contextualização do problema:

O potencial Hidrogeniônico (pH) é uma variável importante no monitoramento da qualidade da água, uma vez que ele afeta o metabolismo de várias espécies aquáticas. De um modo geral, para a proteção da vida aquática, o pH deve estar entre 6 e 9. Tomou-se o conjunto de dados Potencial Hidrogeniônico (pH), obtido junto ao Departamento de Recursos Hídricos do Estado da California, EUA. A série histórica é constituída por 72.570 observações registradas a cada 15 minutos, de 9/mar/2012 a 9/jun/2014.

O objetivo é realizar uma análise exploratória desta série temporal dada por \(X_{t}\) no intraday.


item i)

Dados brutos antes do tratamento:

# ----- leitura e carregamento
library(tibbletime)
library(dplyr)
library(ggplot2)
library(readr)
library(lubridate)
library(reshape2)

ph2012.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/pH2012.CSV"
ph2013.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/pH2013.CSV"
ph2014.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/pH2014.CSV"

ph2012 <- read_csv(ph2012.loc)
ph2013 <- read_csv(ph2013.loc)
ph2014 <- read_csv(ph2014.loc)

# juntando
ph <- bind_rows(ph2012, ph2013, ph2014)

head(ph)

Dados após tratamento:

# ----- data preparation

# convertendo para tibble time (serie temporal)
# library(lubridate)
ph2 <- ph %>%
  dplyr::select(-Qual) %>%
  mutate(Date = lubridate::mdy_hm(Date)) %>% # usando mdy_hm do lubridate
  as_tbl_time(index = Date)

# filtrando
# # nao precisa - vamos usar toda a serie
# ph2 <- ph %>%
#   filter_time('start' ~ 'end')

head(ph2)

Plot da série temporal \(X_{t}\):

# ----- plots serie:

# --- serie intraday 15 min:
# ph2 %>%
# ggplot(aes(x = Date, y = Point, colour="coral2")) +
#   geom_line() +
#   theme_minimal()+
#   labs(title="Série intraday (15 minutos) da variável Point")

# rCharts:
# library(rCharts)
# library(rjson)
# dPlot(MP ~ Date, data = matter3, type="line")

# dygraphs
library(dygraphs)
library(xts)
ph2_ts <- xts(ph2 %>% dplyr::select(Point), order.by=ph2$Date)

dygraph(ph2_ts, elementId='ph2', main="Série intraday (15 minutos) da variável Point" ) %>% dyRangeSelector() %>% dyUnzoom() %>%
  dySeries("Point", color = "blue", strokeWidth = 0.5)

Plots da ACF e PACF:

# ----- plots:

# par(mfrow=c(1,2))
# acf(ph2_ts)
# pacf(ph2_ts)

library(gridExtra)
grid.arrange(gg_acf(ph2_ts, "FAC", lag.max=1000), gg_pacf(ph2_ts, "FACP", lag.max=1000))


item ii)

O gráfico da Função de Autocorrelação (FAC/ACF) claramente nos indica a inexistência de estacionariedade na série devido ao fato de \(\rho(1) \sim 1\). Há também um decaimento bastante lento das correlações conforme se avança no tempo, com picos sazonais, indicando uma certa trajetória dependente do tempo. Portanto, tudo indica que a série não seja estacionária e que tenhamos que fazer uma transformação para trabalhar com estes dados.

Com o objetivo de transformar a série em análise em uma série estacionária, empregaremos a diferenciação de primeira ordem.

Dados após primeira diferenciação:

# ph2_diff <- ph2 %>%
#   mutate(Point = diff(Point ~ Date[-1]))
# 
# ph2_diff <- ph2 %>%
#   mutate(Point = diff(Point))

ph2_ts_diff <- diff(ph2_ts)
# str(ph2_ts_diff)

tibble::as.tibble(head((ph2_ts_diff)))

Plot da série após primeira diferenciação:

dygraph(ph2_ts_diff, elementId='ph2_diff', main="Série diferenciada da variável Point" ) %>% dyRangeSelector() %>% dyUnzoom() %>%
  dySeries("Point", color = "blue", strokeWidth = 0.3)

Com base no gráfico acima, é possível dizer que a série não aponta claros indícios de comportamento não-estacionário, pelo menos com relação a sua média. No entanto, faremos os plots da FAC e FACP a fim de confirmar este resultado.

Plots da ACF e PACF para analisar estacionariedade:

grid.arrange(gg_acf(ph2_ts_diff, "FAC", lag.max=1000), gg_pacf(ph2_ts_diff, "FACP", lag.max=1000))

Ainda com a diferenciação de primeira ordem na série, continua a haver um comportamento cíclico, o que também viola os pressupostos de estacionariedade. Com isso, realizaremos mais uma diferenciação da série na tentativa de eliminar o padrão cíclico e obter estacionariedade.

Dados após segunda diferenciação:

ph2_ts_diff <- diff(ph2_ts_diff)
# str(ph2_ts_diff)

tibble::as.tibble(head((ph2_ts_diff)))

Plot da série após segunda diferenciação:

dygraph(ph2_ts_diff, elementId='ph2_diff2', main="Série diferenciada da variável Point" ) %>% dyRangeSelector() %>% dyUnzoom() %>%
  dySeries("Point", color = "blue", strokeWidth = 0.3)

Plots da ACF e PACF para analisar estacionariedade:

grid.arrange(gg_acf(ph2_ts_diff, "FAC", lag.max=50), gg_pacf(ph2_ts_diff, "FACP", lag.max=50))

Com a queda abrupta da Função de Autocorrelação após no lag 1, temos um forte indicativo de estacionariedade na série. Outros pontos que por ventura ultrapassem as bandas de confiança podem ser atribuídos ao percentual esperado de erro tipo I ou ser considerados valores espúrios devido ao erro amostral.


item iii)

Com base na FAC da série diferenciada, claramente constata-se a existência de um ciclo na série. Pode-se dizer que os ciclos de correlações positivas e negativas se alternam a cada ** 50 lags ** aproximadamente. Levando em consideração que a série apresenta uma periodicidade intraday de 15 em 15 minutos, estes ciclos equivalem, em horas, a:

\[\frac {15 \times 50} {60} = 12.5\]

Portanto, temos ciclos de aproximadamente \(12\) horas nos dados, o que provavelmente indica variações de pH que ocorrem ao se alternar entre o período diurno e noturno.

Com base no gráfico da série diferenciada, é possível dizer que existe um comportamento mais sazonal e não cíclico: há um sensível aumento de volatilidade entre os meses de julho e outubro de cada ano, bem como uma sensível redução da volatilidade nos períodos de transição entre o final e início de cada ano. Não haveria, portanto, um comportamento cíclico, mas sim, sazonal dentro de cada ano.


item iv)

A função de Autocorrelação da série estacionária parece sugerir um modelo de médias móveis puro ARIMA(0,2,3).



3) Análise de dados do índice Dow Jones Industrial da bolsa de valores de Nova Iorque


Contextualização do problema:

Os dados referem-se ao índice Dow Jones Industrial da Bolsa de Valores de Nova Iorque, de 18/9/2009 a 25/05/2010, dispostos numa periodicidade intraday de 1 minuto. As colunas do arquivo de dados, além das datas e dos horários, representam, respectivamente, abertura, máxima, mínima, fechamento e volume.


item i)

Dados brutos antes do tratamento:

# ----- leitura e carregamento
library(tibbletime)
library(dplyr)
library(ggplot2)
library(readr)
library(lubridate)
library(reshape2)

DJI.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/DJI1MIN.txt"

# help(read_table)
DJI <- read_table2(DJI.loc, col_names = FALSE)

head(DJI)

Dados após preparação:

# ----- data preparation

DJI2 <- DJI %>%
  dplyr::select(-1) %>% # eliminando primeira coluna
  magrittr::set_colnames(c("Date", "hora", "open", "max", "min", "close", "vol")) %>%
  #dplyr::arrange(Date, hora) %>% # ordenar por dia/hora 
  na.omit() %>%# removendo os NA's
  dplyr::mutate(Date = paste(Date, hora, sep = " ")) %>% # colando hora na coluna Date
  dplyr::select(- hora) #%>%  # eliminado a coluna da hora
  # dplyr::mutate(vol = log(vol))


# passando para tibble e tibbletime:
DJI3 <- DJI2 %>%
  #tibble::as_tibble() %>%
  #na.omit() %>% # eliminando os NA's
  mutate(Date = lubridate::dmy_hms(Date)) %>% # usando ymd do lubridate
  as_tbl_time(index = Date)



head(DJI3)

Plots das séries DJI:

# ----- plots serie:

# passando para o formato long:
# library(reshape2)
# library(ggplot2)


# DJI3 %>%
#   melt(id.vars = c("Date")) %>%
#   ggplot(aes(x = Date, y = value, colour= variable)) +
#   geom_line(alpha=0.5) +
#   facet_wrap(~variable, ncol=2, scale = "free_y")+
#   # Aesthetics
#   labs(title = "Séries Dow Jones Industrial", x = "",
#        subtitle = "18-09-2009 a 20-05-2010",
#        caption = "Análise de Séries Temporais - UnB 1S2018") +
#   #tidyquant::scale_color_tq() +
#   #theme_tq() +
#   theme_minimal()+
#   theme(legend.position="none")
#   # labs(title="Série intraday (15 minutos) da variável Point")
# ----- plots serie:


# dygraphs
library(dygraphs)
library(xts)


# volume eh mto alto e acaba dominando a serie, por isso, precisa ser separado
DJI3_ts <- xts(DJI3 %>% dplyr::select(open, max, min, close, vol), order.by=DJI3$Date)


# separando as series
series <- c("open_ts", "max_ts", "min_ts", "close_ts", "vol_ts")
for(j in 1:5){
  assign(series[j], DJI3_ts[,j])
}

# 1 plot dygraphs para cada serie
p1 <- dygraphs::dygraph(open_ts, group="DJI", main="Abertura") %>% dySeries("open", strokeWidth = 0.5, color="orange")
p2 <- dygraphs::dygraph(max_ts, group="DJI", main="Máxima") %>% dySeries("max", strokeWidth = 0.5, color="red")
p3 <- dygraphs::dygraph(min_ts, group="DJI", main="Mínima") %>% dySeries("min", strokeWidth = 0.5, color="green")
p4 <- dygraphs::dygraph(close_ts, group="DJI", main="Fechamento") %>% dySeries("close", strokeWidth = 0.5, color="blue")
p5 <- dygraphs::dygraph(vol_ts, group="DJI", main="Volume") %>% dySeries("vol", strokeWidth = 0.5, color="purple")
p1
p3
p2
p4
p5

Plots das FAC e FACP:

grid.arrange(gg_acf(open_ts, "FAC abertura", lag.max=1000), gg_pacf(open_ts,"FACP abertura", lag.max=1000))

grid.arrange(gg_acf(min_ts, "FAC mínima", lag.max=1000), gg_pacf(min_ts, "FACP mínima", lag.max=1000))

grid.arrange(gg_acf(max_ts, "FAC máxima", lag.max=1000), gg_pacf(max_ts, "FACP máxima", lag.max=1000))

grid.arrange(gg_acf(close_ts, "FAC fechamento", lag.max=1000), gg_pacf(close_ts, "FACP fechamento", lag.max=101))

grid.arrange(gg_acf(vol_ts, "FAC volume", lag.max=5000), gg_pacf(vol_ts, "FACP volume", lag.max=5000))

A partir dos gráficos das séries, podemos inferir que as séries de Abertura, Fechamento, Máxima e Mínima não aparentam ser estacionárias. Todas as séries, com exceção da série de volume, apresentam \(\rho(1) \sim 1\) - comportamento de random walk e decaimento extremamente lento na autocorrelação. Segundo Moretin (2005, p.8), o comportamento de passeio aleatório é inerente a maioria das séries financeiras.

Embora não tenha \(\rho(1) \sim 1\), a série do volume apresenta claramente comportamento cíclico a cada \(400\) lags (equivalente a cada 6 horas e meia aproximadamente), o que também acaba por violar o pressuposto de normalidade.


A fim de obter a estacionariedade das séries, utilizaremos novamente a diferenciação.

Diferenciação de ordem 1:

open_ts_diff <- diff(open_ts)
max_ts_diff <- diff(max_ts)
min_ts_diff <- diff(min_ts)
close_ts_diff <- diff(close_ts)
vol_ts_diff <- diff(vol_ts)

# 1 plot dygraphs para cada serie
p1_diff <- dygraphs::dygraph(open_ts_diff, group="DJI_diff", main="Abertura - diferenciada") %>% dySeries("open", strokeWidth = 0.5, color="orange")
p2_diff <- dygraphs::dygraph(max_ts_diff, group="DJI_diff", main="Máxima - diferenciada") %>% dySeries("max", strokeWidth = 0.5, color="coral")
p3_diff <- dygraphs::dygraph(min_ts_diff, group="DJI_diff", main="Mínima - diferenciada") %>% dySeries("min", strokeWidth = 0.5, color="green")
p4_diff <- dygraphs::dygraph(close_ts_diff, group="DJI_diff", main="Fechamento - diferenciada") %>% dySeries("close", strokeWidth = 0.5, color="blue")
p5_diff <- dygraphs::dygraph(vol_ts_diff, group="DJI_diff", main="Fechamento - diferenciada") %>% dySeries("vol", strokeWidth = 0.5, color="purple")
p1_diff
p3_diff
p2_diff
p4_diff
p5_diff

Plots das FAC e FACP das séries diferenciadas:

grid.arrange(gg_acf(open_ts_diff, "FAC abertura - diff", lag.max=1000), gg_pacf(open_ts_diff,"FACP abertura - diff", lag.max=1000))

grid.arrange(gg_acf(min_ts_diff, "FAC mínima - diff", lag.max=1000), gg_pacf(min_ts_diff, "FACP mínima - diff", lag.max=1000))

grid.arrange(gg_acf(max_ts_diff, "FAC máxima - diff", lag.max=1000), gg_pacf(max_ts_diff, "FACP máxima - diff", lag.max=1000))

grid.arrange(gg_acf(close_ts_diff, "FAC fechamento - diff", lag.max=1000), gg_pacf(close_ts_diff, "FACP fechamento - diff", lag.max=1000))

grid.arrange(gg_acf(vol_ts_diff, "FAC volume", lag.max=1000), gg_pacf(vol_ts_diff, "FACP volume", lag.max=1000))

Após tomarmos a primeira diferença das série, apenas a série de volume não apresentou estacionariedade. Por isso, tomaremos a segunda diferença apenas da série de volume a fim de obter a estacionariedade nesta série.

vol_ts_diff <- diff(vol_ts_diff)
# 1 plot dygraphs para cada serie
p5_diff <- dygraphs::dygraph(vol_ts_diff, group="DJI_diff2", main="Volume - segunda diferenciada") %>% dySeries("vol", strokeWidth = 0.5, color="purple")

p5_diff
grid.arrange(gg_acf(vol_ts_diff, "FAC volume", lag.max=5000), gg_pacf(vol_ts_diff, "FACP volume", lag.max=5000))

Como ainda não conseguimos a estacionariedade, vamos utilizar a transformação de Log na série original do volume e depois aplicaremos as 2 diferenciações. Optamos pela utilização da transformação Log por ser bastante utilizada ao se trabalhar com dados financeiros.

Transformação Log:

# vol_ts_box <- forecast::BoxCox(vol_ts, lambda = 0.2)
# vol_ts_box <- forecast::BoxCox(vol_ts, lambda = 0.9)
vol_ts_log <- log(vol_ts)
grid.arrange(gg_acf(vol_ts_log, "FAC Log volume", lag.max=5000), gg_pacf(vol_ts_log, "FACP Log volume", lag.max=5000))

diferença de segunda ordem:

vol_ts_log_diff <- diff(vol_ts_log)
vol_ts_log_diff <- diff(vol_ts_log_diff)
grid.arrange(gg_acf(vol_ts_log_diff, "FAC Log volume", lag.max=5000), gg_pacf(vol_ts_log_diff, "FACP Log volume", lag.max=5000))

Portanto, após aplicar a transformação Log na série original de volume, acompanhada de 2 diferenciações, temos uma série estacionária. As correlações com picos acima das bandas de confiança, podem ser consideradas como valores espúrios devido a erro amostral.


item ii)

Criando as séries \(log(maxima/minima)\) e \(log(fechamento/abertura)\):

# ----- data preparation

DJI4 <- DJI3 %>%
  dplyr::mutate(log_max_min = log(max/min), log_close_open = log(close/open)) %>%
  dplyr::select(Date, log_max_min, log_close_open)
# nao podemos usar transmute pq precisamos de Date tb

head(DJI4)

Plots das séries:

# ----- plots serie:


# dygraphs
library(dygraphs)
library(xts)


# volume eh mto alto e acaba dominando a serie, por isso, precisa ser separado
DJI4_ts <- xts(DJI4 %>% dplyr::select(log_max_min, log_close_open), order.by=DJI4$Date)


# separando as series
series_log <- c("log_max_min_ts", "log_close_open_ts")
for(j in 1:length(series_log)){
  assign(series_log[j], DJI4_ts[,j])
}

# 1 plot dygraphs para cada serie
p1_log <- dygraphs::dygraph(log_max_min_ts, group="Log", main="log(max/min)$") %>% dySeries("log_max_min", strokeWidth = 0.5, color="orange")

p2_log <- dygraphs::dygraph(log_close_open_ts, group="Log", main="log(close/open)") %>% dySeries("log_close_open", strokeWidth = 0.5, color="red")
p1_log
p2_log

Plots das FAC e FACP:

grid.arrange(gg_acf(log_max_min_ts, "FAC log(max/min)", lag.max=100), gg_pacf(log_max_min_ts,"FACP log(max/min)", lag.max=100))

grid.arrange(gg_acf(log_close_open_ts, "FAC log(close/open)", lag.max=100), gg_pacf(log_close_open_ts, "FACP log(close/open)", lag.max=100))

série \(log(max/min)\):

A série apresenta \(\rho(1)\) bem abaixo de 1, mas com um decaimento lento após este lag, o que indica ser um processo estacionário, podendo ser tratado como um processo autorregressivo de memória longa.

# Augmented Dick-Fuller Test for Stationarity
# tseries::adf.test(log_max_min_ts, alternative="stationary", k=20)
# aTSA:::adf.test(log_max_min_ts, nlag=100, output = TRUE)

série \(log(fechamento/abertura)\):

Da análise dos gráficos acima, conclui-se que a série \(log(fechamento/abertura)\) é estacionária, sendo passível de ser representada por um modelo de filtro linear. Neste caso, parece ser adequado um modelo o modelo \(MA(1)\).



Referências Bibliográficas


SHUMWAY, R.H. & STOFFER, D.S. Time Series Analysis and Its Applications with R Examples, Springer, 2011.

MORETTIN, P.A. & TOLOI, C.M. Análise de Séries Temporais, 2 a ed., Edgard Blücher, 2005

R CORE TEAM. R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.